#include <stdio.h>
#include <stdlib.h>

//创建节点结构体
typedef struct node_s
{
    char data;
    struct node_s* lchild;
    struct node_s* rchild;
}node_t;
//创建节点函数
int create_node(node_t** root)
{
    if(NULL == root)
    {
        printf("%s-%s(%d):入参为NULL 请检查\n",__FILE__,__func__,__LINE__);
        return -1;
    }
    //1.输入数据
    char temp = 0;
    scanf("%c", &temp);
    getchar();
    //2.判断是否退出递归（给二叉树赋值）
    if(temp == '#')
    {
        return 0;
    }
    //3.若有赋值，则给新节点分配空间
    *root = (node_t*)malloc(sizeof(node_t));
    if(NULL == *root)
    {
        printf("%s-%s(%d):内存分配失败\n",__FILE__,__func__,__LINE__);
        exit(-1);
    }
    //4.初始化新节点
    (*root)->lchild = NULL;
    (*root)->rchild = NULL;
    (*root)->data = temp;
    //5.递归创建左右指数
    create_node(&((*root)->lchild));
    create_node(&((*root)->rchild));

    return 0;
}
//前序遍历
int front_show(node_t* root)
{
    //既做非空检查，又做递归的出口
    if(NULL == root)
    {
        return -1;
    }
    printf("%c", root->data);
    front_show(root->lchild);
    front_show(root->rchild);
    return 0;
}
//中序遍历
int mid_show(node_t* root)
{
    if(NULL == root)
    {
        return -1;
    }
    mid_show(root->lchild);
    printf("%c", root->data);
    mid_show(root->rchild);
    return 0;
}
//后续遍历
int tail_show(node_t* root)
{
    if(NULL == root)
    {
        return -1;
    }
    tail_show(root->lchild);
    tail_show(root->rchild);
    printf("%c", root->data);
    return 0;
}
int main()
{
    //创建一颗树
    node_t *root = NULL;
    create_node(&root);

    //前序遍历
    qianxu(root);
    printf("\n");
    printf("---------------------------------\n");

    //中序遍历
    zhongxu(root);
    printf("\n");
    printf("---------------------------------\n");

    //后序遍历
    houxu(root);
    printf("\n");

    return 0;
}
